嗨大家好,我是Sean!
昨天講完了model以及migration的基礎操作後,
我們進一步來進入model的奧秘:關聯資料庫(Relational database)的領域。
關聯資料庫,就是建立在關聯模型上的資料庫。聽起來還是很抽象?
關聯其實就是model之間有關係,可以互相聯繫、互補的意思。
舉個例子來說,當我們現在有個People的model,可能有另一個model叫Group。那麼可以依靠People中的欄位來關聯到Group這個table,表示People屬於某個Group中的object。
ex. class People
這樣的關聯關係有下列三種,(看起來很像國中方程式與解的對應關係...):
接下來,我們來分別解析三種不同的對應關係,應該如何應用在不同的情境當中!
讓我們假設有一個左表來對應一個右表,並在看到表的同時,照著以下的步驟分析:
最常見的關聯型態,便是我們的多對一關係,需設置ForeignKey,也就是外來鍵。
簡單舉例來說:
左表為People,右表為國籍(一個人只有單一國籍):
那麼左表的多條紀錄(多個人),可能可以對應右表的一條紀錄(其中一個的國籍)
ex. class People
若分析一及分析二皆不成立,則左表的一條紀錄唯一對應右表的一條紀錄。
此時,我們可以在左表設置OneToOneField,指向右表即可。
一對一關係,在Django中,最常使用的地方在於原生的User以及我們客製化的UserProfile model。
這麼做的好處在於,善加利用原生的User model的同時,可以利用我們寫的UserProfile來一對一,對應User表裡的每一個使用者。
通常會將OneToOneField的欄位寫在第一個,很容易就可以看清楚對應的表是哪個
ex. class UserProfile
若分析一及分析二同時成立,兩表為雙向多對一,即多對多。
需創建一張新表,專門存放左右二表的關係,關聯字段寫在新表中
舉例來說,商品與種類的關係,通常為多對多之關係。一個商品可以隸屬於多種分類中,而一種分類類別裡,也可以有多種商品被分類其中。
ex.
class Product: <===> class Category
category = models.ManyToManyField(Category, through='Product_Category', through_fields=('product', 'category'))
class Product_Category:
product = models.ForeignKey(Product, )
category = models.ForeignKey(Category, )
剛開始,看起來會有點模糊,但我覺得這樣的分析對我來說,可以很清楚直觀的判斷model與model之間的對應關係,推薦給大家這樣的思考邏輯。
那麼今天的文章就到此結束,
希望以後你看到表的關係,可以覺得'沒關係,輕鬆'的解決xDD 快速判斷表表之間的關係。
我是Sean,你各位海上的人,我們明天見!